home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / MP132src.lha / stplay.asm < prev    next >
Assembly Source File  |  1992-09-14  |  13KB  |  623 lines

  1. * MultiPlayer
  2. * Copyright (C) 1992 Bryan Ford
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. *
  18. * I (the author of MultiPlayer) can be contacted on the Internet at
  19. * "bryan.ford@m.cc.utah.edu".  See "Player.doc" for other addresses.
  20. *
  21. * Note:  This playroutine was not originally written by me.  In general
  22. * these playroutines are public domain, so I am bringing the versions
  23. * modified for MultiPlayer under the General Public License.  In the
  24. * few cases of already-copyrighted playroutines, the above copyright
  25. * notice applies only to the parts of the file written by me.
  26. *
  27. * $Id: stplay.asm,v 4.1 92/06/21 11:15:03 BAF Exp Locker: BAF $
  28. *
  29.  
  30.     include    "player.i"
  31.  
  32.     xref    modmem,modend,suppmem
  33.     xref    getfreqmodspeed,ntgetsongname,ntgetsongauthor,dmawait
  34.  
  35.     xdef    ststart
  36.  
  37.     code    text
  38.  
  39. ststart:
  40.     plstartret 9$
  41.  
  42.         cnop    0,4
  43.     dc.l    gmod_Hook
  44. 9$    gmodnop
  45.     gmodbra    mt_init            ; StartMusic
  46.     gmodnop
  47.     gmodnop
  48.     gmodnop
  49.     gmodq    1            ; ContinueMusic
  50.     gmodnop
  51.     gmodnop
  52.     gmodnop
  53.     gmodnop
  54.     gmodnop
  55.     gmodnop
  56.     gmodnop
  57.     gmodbra    ntgetsongname        ; GetSongName
  58.     gmodbra    ntgetsongauthor        ; GetSongAuthor
  59.     gmodbra    getfreqmodspeed        ; GetFrequency
  60.     gmodbra    mt_music        ; TimerTick
  61.     lea    name(pc),a0        ; GetMakerName
  62.     move.l    a0,d0
  63.     rts
  64.  
  65. **********************************************
  66. *
  67. * Soundtracker Module-Player
  68. *   for    Soundtracker V2.6
  69. *
  70. * SEKA version
  71. * (Devpac: replace 'blk' with 'dcb' (sic!) )
  72. *
  73. * last change: 03-Nov-90 mtn
  74. *
  75. **********************************************
  76. * Note:    mt_init    has to be called up with the
  77. * address of the module    in A0 !!
  78. **********************************************
  79.  
  80. * equates for voice-structure *
  81. mt_cmdperiod equ 0            ;period
  82. mt_cmd equ 2                ;instr/cmd
  83. mt_cmdpar equ 3                ;cmd-parameter
  84. mt_sampleadr equ 4            ;address of    sample
  85. mt_samplelen equ 8            ;length    of sample
  86. mt_samplerep equ $a            ;address of    repeat-part
  87. mt_samplerepl equ $e            ;length    of repeat-part
  88. mt_period equ $10            ;period    to play
  89. mt_volume equ $12            ;volume    to set
  90. mt_dmabit equ $14            ;dmabit    for    channel
  91. mt_slidedir equ    $16            ;slide up/down
  92. mt_slidespeed equ $17            ;speed of slide
  93. mt_slidedest equ $18            ;slide to period x
  94. mt_vibamp equ $1a            ;vibrato amplitude
  95. mt_vibcount equ    $1b            ;counter for vibrato
  96. mt_voicelen equ    $1c
  97.  
  98. * equates for global player data-structure *
  99. mt_data    equ 0                ;address of    module
  100. mt_pattpos equ 4            ;current position
  101. mt_dmacon equ 6                ;dma-bits
  102. mt_speedEven equ 8            ;current speed (even frames)
  103. mt_speedOdd equ    9            ; -"- (odd frames)
  104. mt_songpos equ $a            ;position-counter
  105. mt_counter equ $b            ;frame-counter
  106. mt_break equ $c                ;flag for pattern-break
  107. mt_datalen equ $e
  108.  
  109. mt_init:
  110.     movem.l    a2-a4,-(SP)
  111.     lea    mt_playerdata(PC),a4
  112. *    clr.l     mt_data(a4)
  113. *    cmp.l     #'MTN'*256,$5b8(a0)
  114. *    bne     mt_initerror
  115.     move.l    a0,mt_data(a4)
  116.     move.l    modend,a3
  117.     subq.l    #4,a3
  118.  
  119.     lea    $3b8(a0),a1
  120.     moveq    #0,d1
  121.     move.w    #$1ff,d0
  122. mt_loop:
  123.     cmp.b    0(a1,d0.w),d1
  124.     bhi.s    mt_nothigh
  125.     move.b    0(a1,d0.w),d1
  126. mt_nothigh:
  127.     dbf    d0,mt_loop
  128.     addq.b    #1,d1
  129.  
  130.     lea    mt_samplestarts(PC),a1
  131.     lsl.l    #8,d1
  132.     lea    0(a0,d1.l),a2
  133.     add.w    #$5bc,a2
  134.     moveq    #$1e,d0
  135. mt_lop3: cmp.l     a2,a3             ; < Fix - prevent trashing memory
  136.     blt.s    1$
  137.     clr.l    (a2)
  138. 1$    move.l    a2,(a1)+
  139.     moveq    #0,d1
  140.     move.w    42(a0),d1
  141.     add.l    d1,d1
  142.     add.l    d1,a2
  143.     add.w    #$1e,a0
  144.     dbf    d0,mt_lop3
  145.  
  146.     or.b    #2,$bfe001
  147.     move.b    #$06,mt_speedEven(a4)
  148.     move.b    #$06,mt_speedOdd(a4)
  149.     lea    mt_voice1(PC),a0
  150.     move.w    #$0001,mt_dmabit(a0)
  151.     lea    mt_voice2(PC),a0
  152.     move.w    #$0002,mt_dmabit(a0)
  153.     lea    mt_voice3(PC),a0
  154.     move.w    #$0004,mt_dmabit(a0)
  155.     lea    mt_voice4(PC),a0
  156.     move.w    #$0008,mt_dmabit(a0)
  157.     lea    $dff0a8,a0
  158.     clr.w    (a0)
  159.     clr.w    $10(a0)
  160.     clr.w    $20(a0)
  161.     clr.w    $30(a0)
  162.     clr.b    mt_songpos(a4)
  163.     clr.b    mt_counter(a4)
  164.     clr.w    mt_pattpos(a4)
  165. *mt_initerror:
  166.     movem.l    (SP)+,a2-a4
  167.     rts
  168.  
  169. mt_end:
  170.     move.l    a0,-(SP)
  171.     lea    $dff0a8,a0
  172.     clr.w    (a0)
  173.     clr.w    $10(a0)
  174.     clr.w    $20(a0)
  175.     clr.w    $30(a0)
  176.     move.w    #$f,$96-$a8(a0)
  177.     move.l    (SP)+,a0
  178.     rts
  179.  
  180. mt_music:
  181.     movem.l    d2-d5/a2-a6,-(SP)
  182.     lea    mt_playerdata(PC),a4
  183.     move.l    mt_data(a4),d0
  184.     beq    mt_playerror
  185.     move.l    d0,a0
  186.     addq.b    #1,mt_counter(a4)
  187.     move.b    mt_counter(a4),d0
  188.     move.w    mt_pattpos(a4),d1
  189.     lsr.w    #2,d1
  190.     and.w    #1,d1
  191.     move.b    mt_speedEven(a4,d1.w),d1
  192.     cmp.b    d1,d0
  193.     blt.s    mt_nonew
  194.     clr.b    mt_counter(a4)
  195.     bra    mt_getnew
  196.  
  197. mt_nonew:
  198.     lea    mt_voice1(PC),a6
  199.     lea    $dff0a0,a5
  200.     bsr    mt_checkcom
  201.     lea    mt_voice2(PC),a6
  202.     lea    $dff0b0,a5
  203.     bsr    mt_checkcom
  204.     lea    mt_voice3(PC),a6
  205.     lea    $dff0c0,a5
  206.     bsr    mt_checkcom
  207.     lea    mt_voice4(PC),a6
  208.     lea    $dff0d0,a5
  209.     bsr    mt_checkcom
  210.     bra    mt_endr
  211.  
  212. mt_arpeggio:
  213.     moveq    #0,d0
  214.     move.b    mt_counter(a4),d0
  215.     divu    #$3,d0
  216.     swap    d0
  217.     tst.w    d0
  218.     beq.s    mt_arp2
  219.     cmp.w    #2,d0
  220.     beq.s    mt_arp1
  221.  
  222.     moveq    #0,d0
  223.     move.b    mt_cmdpar(a6),d0
  224.     lsr.b    #4,d0
  225.     bra.s    mt_arp3
  226. mt_arp1: moveq     #0,d0
  227.     move.b    mt_cmdpar(a6),d0
  228.     and.b    #$f,d0
  229.     bra.s    mt_arp3
  230. mt_arp2: move.w     mt_period(a6),d2
  231.     bra.s    mt_arp4
  232. mt_arp3: add.w     d0,d0
  233.     moveq    #0,d1
  234.     move.w    mt_period(a6),d1
  235.     lea    mt_periods(PC),a0
  236.     moveq    #$24,d3
  237. mt_arploop:
  238.     move.w    0(a0,d0.w),d2
  239.     cmp.w    (a0),d1
  240.     bge.s    mt_arp4
  241.     addq.l    #2,a0
  242.     dbf    d3,mt_arploop
  243.     rts
  244. mt_arp4: move.w     d2,6(a5)
  245.     rts
  246.  
  247. mt_getnew:
  248.     clr.w    mt_dmacon(a4)
  249.  
  250.     lea    $dff0a0,a5
  251.     lea    mt_voice1(pc),a6
  252.     moveq    #0,d5
  253.     bsr.s    mt_playvoice
  254.     lea    $dff0b0,a5
  255.     lea    mt_voice2(pc),a6
  256.     moveq    #1,d5
  257.     bsr.s    mt_playvoice
  258.     lea    $dff0c0,a5
  259.     lea    mt_voice3(pc),a6
  260.     moveq    #2,d5
  261.     bsr.s    mt_playvoice
  262.     lea    $dff0d0,a5
  263.     lea    mt_voice4(pc),a6
  264.     moveq    #3,d5
  265.     bsr.s    mt_playvoice
  266.     bra    mt_setdma
  267.  
  268. mt_playvoice:
  269.     move.l    mt_data(a4),a0
  270.     lea    12(a0),a3
  271.     lea    $3b8(a0),a2
  272.     lea    $5bc(a0),a0
  273.  
  274.     moveq    #0,d0
  275.     moveq    #0,d1
  276.     move.b    mt_songpos(a4),d0
  277.     lsl.w    #2,d0
  278.     add.w    d0,a2
  279.     move.b    0(a2,d5.w),d1
  280.     lsl.l    #8,d1
  281.     add.w    mt_pattpos(a4),d1
  282.  
  283.     move.l    0(a0,d1.l),mt_cmdperiod(a6)
  284.     addq.l    #4,d1
  285.     moveq    #0,d2
  286.     move.b    mt_cmd(a6),d2
  287.     and.b    #$f0,d2
  288.     lsr.b    #4,d2
  289.     move.b    mt_cmdperiod(a6),d0
  290.     and.b    #$f0,d0
  291.     or.b    d0,d2
  292.     tst.b    d2
  293.     beq.s    mt_setregs
  294.     moveq    #0,d3
  295.     lea    mt_samplestarts(PC),a1
  296.     move.l    d2,d4
  297.     subq.l    #$1,d2
  298.     lsl.l    #2,d2
  299.     mulu    #$1e,d4
  300.     move.l    0(a1,d2.l),mt_sampleadr(a6)
  301.     move.w    0(a3,d4.l),mt_samplelen(a6)
  302.     move.w    $2(a3,d4.l),mt_volume(a6)
  303.     move.w    $4(a3,d4.l),d3
  304.     tst.w    d3
  305.     beq.s    mt_noloop
  306.     move.l    mt_sampleadr(a6),d2
  307.     add.w    d3,d3
  308.     add.l    d3,d2
  309.     move.l    d2,mt_samplerep(a6)
  310.     move.w    $4(a3,d4.l),d0
  311.     add.w    $6(a3,d4.l),d0
  312.     move.w    d0,mt_samplelen(a6)
  313.     move.w    $6(a3,d4.l),mt_samplerepl(a6)
  314.     move.w    mt_volume(a6),8(a5)
  315.     bra.s    mt_setregs
  316. mt_noloop:
  317.     move.l    mt_sampleadr(a6),d2
  318.     add.l    d3,d2
  319.     move.l    d2,mt_samplerep(a6)
  320.     move.w    $6(a3,d4.l),mt_samplerepl(a6)
  321.     move.w    mt_volume(a6),8(a5)
  322. mt_setregs:
  323.     move.w    mt_cmdperiod(a6),d0
  324.     and.w    #$fff,d0
  325.     beq    mt_checkcom2
  326.     move.b    mt_cmd(a6),d0
  327.     and.b    #$f,d0
  328.     cmp.b    #$3,d0
  329.     bne.s    mt_setperiod
  330.     bsr    mt_setmyport
  331.     bra    mt_checkcom2
  332. mt_setperiod:
  333.     move.w    mt_cmdperiod(a6),mt_period(a6)
  334.     and.w    #$fff,mt_period(a6)
  335.     move.w    mt_dmabit(a6),$dff096
  336.     clr.b    mt_vibcount(a6)
  337.  
  338.     move.l    mt_sampleadr(a6),(a5)
  339.     move.w    mt_samplelen(a6),4(a5)
  340.     move.w    mt_period(a6),d0
  341.     and.w    #$fff,d0
  342.     move.w    d0,6(a5)
  343.     move.w    mt_dmabit(a6),d0
  344.     or.w    d0,mt_dmacon(a4)
  345.     bra    mt_checkcom2
  346.  
  347. mt_setdma:
  348.     lea    $dff000,a5
  349.     moveq    #8,d3                ;less than this    can cause trouble
  350.     bsr    mt_waitscan
  351.     move.w    mt_dmacon(a4),d0
  352.     or.w    #$8000,d0
  353.     move.w    d0,$96(a5)
  354.     moveq    #1,d3
  355.     bsr    mt_waitscan
  356.     lea    mt_voice4(pc),a6
  357.     move.l    mt_samplerep(a6),$d0(a5)
  358.     move.w    mt_samplerepl(a6),$d4(a5)
  359.     lea    mt_voice3(pc),a6
  360.     move.l    mt_samplerep(a6),$c0(a5)
  361.     move.w    mt_samplerepl(a6),$c4(a5)
  362.     lea    mt_voice2(pc),a6
  363.     move.l    mt_samplerep(a6),$b0(a5)
  364.     move.w    mt_samplerepl(a6),$b4(a5)
  365.     lea    mt_voice1(pc),a6
  366.     move.l    mt_samplerep(a6),$a0(a5)
  367.     move.w    mt_samplerepl(a6),$a4(a5)
  368.  
  369.     addq.w    #4,mt_pattpos(a4)
  370.     cmp.w    #$100,mt_pattpos(a4)
  371.     bne.s    mt_endr
  372. mt_nex:    clr.w    mt_pattpos(a4)
  373.     clr.b    mt_break(a4)
  374.     addq.b    #1,mt_songpos(a4)
  375.     and.b    #$7f,mt_songpos(a4)
  376.     move.b    mt_songpos(a4),d1
  377.     move.l    mt_data(a4),a0
  378.     cmp.b    $3b6(a0),d1
  379.     bne.s    mt_endr
  380.     clr.b    mt_songpos(a4)
  381. mt_endr: tst.b     mt_break(a4)
  382.     bne.s    mt_nex
  383. mt_playerror:
  384.     movem.l    (SP)+,d2-d5/a2-a6
  385.     rts
  386.  
  387. mt_waitscan:
  388.     move.b    6(a5),d1
  389. mt_scanloop:
  390.     cmp.b    6(a5),d1
  391.     beq.s    mt_scanloop
  392.     dbf    d3,mt_waitscan
  393.     rts
  394.  
  395. mt_setmyport:
  396.     move.w    mt_cmdperiod(a6),d2
  397.     and.w    #$fff,d2
  398.     move.w    d2,mt_slidedest(a6)
  399.     move.w    mt_period(a6),d0
  400.     clr.b    mt_slidedir(a6)
  401.     cmp.w    d0,d2
  402.     beq.s    mt_clrport
  403.     bge.s    mt_rt
  404.     move.b    #$1,mt_slidedir(a6)
  405.     rts
  406. mt_clrport:
  407.     clr.w    mt_slidedest(a6)
  408. mt_rt:    rts
  409.  
  410. mt_myport:
  411.     move.b    mt_cmdpar(a6),d0
  412.     beq.s    mt_myslide
  413.     move.b    d0,mt_slidespeed(a6)
  414.     clr.b    mt_cmdpar(a6)
  415. mt_myslide:
  416.     tst.w    mt_slidedest(a6)
  417.     beq.s    mt_rt
  418.     moveq    #0,d0
  419.     move.b    mt_slidespeed(a6),d0
  420.     tst.b    mt_slidedir(a6)
  421.     bne.s    mt_mysub
  422.     add.w    d0,mt_period(a6)
  423.     move.w    mt_slidedest(a6),d0
  424.     cmp.w    mt_period(a6),d0
  425.     bgt.s    mt_myok
  426.     move.w    mt_slidedest(a6),mt_period(a6)
  427.     clr.w    mt_slidedest(a6)
  428. mt_myok: move.w     mt_period(a6),$6(a5)
  429.     rts
  430. mt_mysub:
  431.     sub.w    d0,mt_period(a6)
  432.     move.w    mt_slidedest(a6),d0
  433.     cmp.w    mt_period(a6),d0
  434.     blt.s    mt_myok
  435.     move.w    mt_slidedest(a6),mt_period(a6)
  436.     clr.w    mt_slidedest(a6)
  437.     move.w    mt_period(a6),$6(a5)
  438.     rts
  439.  
  440. mt_vib:    move.b    mt_cmdpar(a6),d0
  441.     beq.s    mt_vi
  442.     move.b    d0,mt_vibamp(a6)
  443.  
  444. mt_vi:    move.b    mt_vibcount(a6),d0
  445.     lea    mt_sin(PC),a0
  446.     lsr.w    #$2,d0
  447.     and.w    #$1f,d0
  448.     moveq    #0,d2
  449.     move.b    0(a0,d0.w),d2
  450.     move.b    mt_vibamp(a6),d0
  451.     and.w    #$f,d0
  452.     mulu    d0,d2
  453.     lsr.w    #$6,d2
  454.     move.w    mt_period(a6),d0
  455.     tst.b    mt_vibcount(a6)
  456.     bmi.s    mt_vibmin
  457.     add.w    d2,d0
  458.     bra.s    mt_vib2
  459. mt_vibmin:
  460.     sub.w    d2,d0
  461. mt_vib2: move.w     d0,$6(a5)
  462.     move.b    mt_vibamp(a6),d0
  463.     lsr.w    #$2,d0
  464.     and.w    #$3c,d0
  465.     add.b    d0,mt_vibcount(a6)
  466.     rts
  467.  
  468. mt_nop:    move.w    mt_period(a6),$6(a5)
  469.     rts
  470.  
  471. mt_checkcom:
  472.     move.w    mt_cmd(a6),d0
  473.     and.w    #$fff,d0
  474.     beq.s    mt_nop
  475.     move.b    mt_cmd(a6),d0
  476.     and.b    #$f,d0
  477.     tst.b    d0
  478.     beq    mt_arpeggio
  479.     cmp.b    #$1,d0
  480.     beq.s    mt_portup
  481.     cmp.b    #$2,d0
  482.     beq    mt_portdown
  483.     cmp.b    #$3,d0
  484.     beq    mt_myport
  485.     cmp.b    #$4,d0
  486.     beq    mt_vib
  487.     move.w    mt_period(a6),$6(a5)
  488.     cmp.b    #$a,d0
  489.     beq.s    mt_volslide
  490.     rts
  491.  
  492. mt_volslide:
  493.     moveq    #0,d0
  494.     move.b    mt_cmdpar(a6),d0
  495.     lsr.b    #4,d0
  496.     tst.b    d0
  497.     beq.s    mt_voldown
  498.     add.w    d0,mt_volume(a6)
  499.     cmp.w    #$40,mt_volume(a6)
  500.     bmi.s    mt_vol2
  501.     move.w    #$40,mt_volume(a6)
  502. mt_vol2: move.w     mt_volume(a6),$8(a5)
  503.     rts
  504.  
  505. mt_voldown:
  506.     moveq    #0,d0
  507.     move.b    mt_cmdpar(a6),d0
  508.     and.b    #$f,d0
  509.     sub.w    d0,mt_volume(a6)
  510.     bpl.s    mt_vol3
  511.     clr.w    mt_volume(a6)
  512. mt_vol3: move.w     mt_volume(a6),$8(a5)
  513.     rts
  514.  
  515. mt_portup:
  516.     moveq    #0,d0
  517.     move.b    mt_cmdpar(a6),d0
  518.     sub.w    d0,mt_period(a6)
  519.     move.w    mt_period(a6),d0
  520.     and.w    #$fff,d0
  521.     cmp.w    #$71,d0
  522.     bpl.s    mt_por2
  523.     and.w    #$f000,mt_period(a6)
  524.     or.w    #$71,mt_period(a6)
  525. mt_por2: move.w     mt_period(a6),d0
  526.     and.w    #$fff,d0
  527.     move.w    d0,$6(a5)
  528.     rts
  529.  
  530. mt_portdown:
  531.     clr.w    d0
  532.     move.b    mt_cmdpar(a6),d0
  533.     add.w    d0,mt_period(a6)
  534.     move.w    mt_period(a6),d0
  535.     and.w    #$fff,d0
  536.     cmp.w    #$358,d0
  537.     bmi.s    mt_por3
  538.     and.w    #$f000,mt_period(a6)
  539.     or.w    #$358,mt_period(a6)
  540. mt_por3: move.w     mt_period(a6),d0
  541.     and.w    #$fff,d0
  542.     move.w    d0,$6(a5)
  543.     rts
  544.  
  545. mt_checkcom2:
  546.     move.b    mt_cmd(a6),d0
  547.     and.b    #$f,d0
  548.     cmp.b    #$e,d0
  549.     beq.s    mt_setfilt
  550.     cmp.b    #$d,d0
  551.     beq.s    mt_pattbreak
  552.     cmp.b    #$b,d0
  553.     beq.s    mt_posjmp
  554.     cmp.b    #$c,d0
  555.     beq.s    mt_setvol
  556.     cmp.b    #$f,d0
  557.     beq.s    mt_setspeed
  558.     rts
  559.  
  560. mt_setfilt:
  561.     move.b    mt_cmdpar(a6),d0
  562.     and.b    #1,d0
  563.     add.b    d0,d0
  564.     and.b    #$fd,$bfe001
  565.     or.b    d0,$bfe001
  566.     rts
  567. mt_pattbreak:
  568.     st    mt_break(a4)
  569.     rts
  570. mt_posjmp:
  571.     move.b    mt_cmdpar(a6),d0
  572.     subq.b    #1,d0
  573.     move.b    d0,mt_songpos(a4)
  574.     st    mt_break(a4)
  575.     rts
  576. mt_setvol:
  577.     cmp.b    #$40,mt_cmdpar(a6)
  578.     ble.s    mt_vol4
  579.     move.b    #$40,mt_cmdpar(a6)
  580. mt_vol4: move.b     mt_cmdpar(a6),$8(a5)
  581.     rts
  582. mt_setspeed:
  583.     move.b    mt_cmdpar(a6),d0
  584.     and.w    #$ff,d0
  585.     beq.s    mt_rts2
  586.     move.b    d0,d1
  587.     and.b    #$f0,d1
  588.     beq.s    mt_speed1
  589.     lsr.b    #4,d1
  590.     bra.s    mt_speed3
  591. mt_speed1:
  592.     move.b    d0,d1
  593. mt_speed3:
  594.     and.b    #$f,d0
  595.     bne.s    mt_speed2
  596.     move.b    d1,d0
  597. mt_speed2:
  598.     move.b    d0,mt_speedEven(a4)
  599.     move.b    d1,mt_speedOdd(a4)
  600.     clr.b    mt_counter(a4)
  601. mt_rts2: rts
  602.  
  603. mt_sin:
  604.     dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  605.     dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  606.  
  607. mt_periods:
  608.     dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
  609.     dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
  610.     dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
  611.     dc.w $007f,$0078,$0071,$0000,$0000
  612.  
  613. mt_playerdata:    ds.b   mt_datalen
  614. mt_samplestarts: ds.l    31
  615. mt_voice1:    ds.b   mt_voicelen
  616. mt_voice2:    ds.b   mt_voicelen
  617. mt_voice3:    ds.b   mt_voicelen
  618. mt_voice4:    ds.b   mt_voicelen
  619.  
  620. name    dc.b    "SoundTracker 2.6",0
  621.  
  622.     end
  623.